package partner_content_api

import (
	"gitee.com/theegg/go-brick/app/model/content/node_category"
	"gitee.com/theegg/go-brick/app/model/content/nodes"
	"gitee.com/theegg/go-brick/app/model/content/tags"
	"gitee.com/theegg/go-brick/app/model/system/system_images"
	"gitee.com/theegg/go-brick/app/service/app"
	"gitee.com/theegg/go-brick/app/service/help/cstruct"
	"github.com/gin-gonic/gin"
	"strconv"
	"strings"
)

func GetNodeList(c *gin.Context) {
	// 检验参数
	var validaParams nodes.NodeQueryParams
	if err := c.ShouldBind(&validaParams); err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	// 查询数据
	data, err := nodes.GetDataList(cstruct.StructToMap(validaParams))
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), data)
		return
	}

	app.NewResponse(c).JsonReturn(true, "获取数据成功", data)
	return
}

// @title GetNodeDetail
// @description 获取内容详情
func GetNodeDetail(c *gin.Context) {
	idStr := c.PostForm("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	data := make(map[string]interface{})

	// 如果有ID 返回数据详情
	if id > 0 {
		node, errGet := nodes.GetItemById(id)
		if errGet != nil {
			app.NewResponse(c).JsonReturn(false, errGet.Error(), nil)
			return
		}

		// 获取tag
		tags, errTag := tags.GetTagsByNodeId(node.Id)
		if errTag != nil {
			app.NewResponse(c).JsonReturn(false, errTag.Error(), nil)
			return
		}

		tagStr := ""
		for _, v := range tags {
			tagStr += v.TagTitle + ","
		}

		data["item"] = map[string]interface{}{
			"id":              node.Id,
			"title":           node.Title,
			"category_id":     node.CategoryId,
			"user_id":         node.AuthorId,
			"content":         node.Content,
			"summary":         node.Summary,
			"image_cover":     node.ImageCover,
			"image_cover_url": app.GetImageStaticUrl(node.ImageCover),
			"comment_state":   node.CommentState,
			"tags":            strings.TrimRight(tagStr, ","),
		}
	}

	data["category_options"] = nodes.NodeCategory

	// 获取 编辑　选择数据
	editorOption, errEco := node_category.GetEditorSelectOption()
	if errEco != nil {
		app.NewResponse(c).JsonReturn(false, errEco.Error(), nil)
		return
	}
	data["editor_option"] = editorOption

	app.NewResponse(c).JsonReturn(true, "获取数据成功", data)
	return
}

// @title NodeAdd
// @description 添加节点
func NodeAdd(c *gin.Context) {
	idStr := c.PostForm("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	var nodeModel *nodes.Nodes
	var errGet error

	if id > 0 {
		nodeModel, errGet = nodes.GetItemById(id)
		if errGet != nil {
			app.NewResponse(c).JsonReturn(false, errGet.Error(), nil)
			return
		}
	} else {
		nodeModel = new(nodes.Nodes)
	}

	// 校验参数
	var validaParams nodes.NodeAddParams
	if err := c.ShouldBind(&validaParams); err != nil {
		app.NewResponse(c).JsonReturn(false, "bind-json-"+err.Error(), nil)
		return
	}

	adminMenu, errAu := nodeModel.AddOrUpdate(validaParams)
	if errAu != nil {
		app.NewResponse(c).JsonReturn(false, errAu.Error(), adminMenu)
		return
	}

	// 刷新缓存
	nodes.DeleteDetailCacheById(nodeModel.Id)

	app.NewResponse(c).JsonReturn(true, "添加数据成功", nil)
	return
}

// @title NodeState
// @description 修改node状态
func NodeState(c *gin.Context) {
	node, err := getTargetNodeFromParams(c)
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	// 动作
	action := c.PostForm("action")
	if action != "publish" && action != "un_publish" {
		action = "publish"
	}

	if action == "publish" {
		errPublish := node.Publish()
		if errPublish != nil {
			app.NewResponse(c).JsonReturn(false, errPublish.Error(), nil)
			return
		}

		app.NewResponse(c).JsonReturn(true, "恭喜, 上架成功", nil)
		return
	}

	if action == "un_publish" {
		errUnPublish := node.UnPublish()
		if errUnPublish != nil {
			app.NewResponse(c).JsonReturn(false, errUnPublish.Error(), nil)
			return
		}

		app.NewResponse(c).JsonReturn(true, "恭喜, 下架成功", nil)
		return
	}
}

// @title NodeDel
// @description 删除node
func NodeDel(c *gin.Context) {
	node, err := getTargetNodeFromParams(c)
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	// 删除
	errDel := node.DeleteItem()
	if errDel != nil {
		app.NewResponse(c).JsonReturn(false, errDel.Error(), nil)
		return
	}

	app.NewResponse(c).JsonReturn(true, "删除内容数据成功", nil)
	return
}

// @title NodeImageUpload
// @description 图片上传 cover / content
func NodeImageUpload(c *gin.Context) {
	imgType := c.PostForm("type")
	if imgType != "cover" {
		imgType = "content"
	}

	imageName, errUpload := system_images.SaveImage("node", imgType, c)
	if errUpload != nil {
		app.NewResponse(c).JsonReturn(false, errUpload.Error(), nil)
		return
	}

	returnData := make(map[string]interface{})
	returnData["file_url"] = app.GetImageStaticUrl(imageName)
	returnData["file_name"] = imageName

	app.NewResponse(c).JsonReturn(true, "上传图片成功!", returnData)
	return
}

/** =========================== 辅助查询 ============================ **/
// @title getTargetNodeFromParams
// @description 内置方法　通过参数id获取目标对象
func getTargetNodeFromParams(c *gin.Context) (*nodes.Nodes, error) {
	id := c.PostForm("id")
	if id == "" {
		return nil, app.NewError("对不起, 管理员ID不能为空")
	}

	// ID 转换格式
	int64Id, errParse := strconv.ParseInt(id, 10, 64)
	if errParse != nil {
		return nil, app.NewError("对不起, 目标用户ID格式不正确")
	}

	// 获取对象
	item, errTarget := nodes.GetItemById(int64Id)
	if errTarget != nil {
		return nil, app.NewError(errTarget)
	}

	// 目标需要存在
	if item == nil {
		return nil, app.NewError("对不起, 目标不存在")
	}

	return item, nil
}
